global ReadPort
global WritePort
global ReadPortW
global WritePortW

; U08 ReadPort(U16 port)
; 从 port 端口读一个字节数据
ReadPort:
    push ebp
    mov ebp, esp

    xor eax, eax        ; eax = 0;
    mov dx, [ebp + 8]   ; port
    in al, dx           ; 读 dx 端口数据到 al 寄存器中
    
    leave
    ret


; void WritePort(U16 port, U08 data)
; 将一个字节的 data 数据写到 port 端口中
WritePort:
    push ebp
    mov ebp, esp

    xor eax, eax        ; eax = 0;
    mov dx, [ebp + 8]   ; port
    mov al, [ebp + 12]  ; data
    out dx, al          ; 将 al 寄存器中的值写入 dx 端口中

    leave
    ret


; void ReadPortW(U16 port, U16* buf, U32 n)
; 从 port 端口连续读取 n 个 WORD （双字节）数据到 buf 中
ReadPortW:
    push ebp
    mov ebp, esp
    
    mov edx, [ebp + 8]   ; port
    mov edi, [ebp + 12]  ; buf
    mov ecx, [ebp + 16]  ; n
    
    cld                  ; 自增
    rep insw             ; rep: 重复指令，重复次数由 ecx 寄存器确定
    
    leave
    ret


; void WritePortW(U16 port, U16* buf, U32 n)
; 将 buf 中的连续 n 个 WORD （双字节）数据写到 port 端口中
WritePortW:
    push ebp
    mov ebp, esp
    
    mov edx, [ebp + 8]   ; port
    mov esi, [ebp + 12]  ; buf
    mov ecx, [ebp + 16]  ; n
    
    cld                  ; 自增
    rep outsw            ; rep: 重复指令，重复次数由 ecx 寄存器确定
    
    leave
    ret
